home *** CD-ROM | disk | FTP | other *** search
- /* Listing 16.35 Ferrule displacement shader for a pencil*/
- /*
- * dferrule(): Deform the cylinder that models the ferrule of a pencil.
- * The shader adds four ridges that circumscribe the cylinder and
- * many more between the innermost ridges that are parallel to
- * the cylinder's axis. The ridges are displaced sine waves.
- * The ferrule is also slightly flared at the eraser end.
- */
- #define UFREQ 219.911
- #define VFREQ 104.72
- #define R1MIN .17
- #define R1MAX .23
- #define R2MIN .31
- #define R2MAX .37
- #define R3MIN .63
- #define R3MAX .69
- #define R4MIN .77
- #define R4MAX .83
- displacement
- RCDFerrule(
- float Km = .005 )
- {
- float magnitude = 0;
-
- /* Compute the distance the surface should be displaced. */
- if (v <= .02) /* the eraser-end flair */
- magnitude = 2*(1 - sin(78.54*v));
-
- if ((v >= R1MIN) && (v <= R1MAX)) /* first circular ridge */
- magnitude = 3*(1 - cos(VFREQ*(v-R1MIN)));
- else if ((v >= R2MIN) && (v <= R2MAX)) /* second circular ridge */
- magnitude = 3*(1 - cos(VFREQ*(v-R2MIN)));
- else if ((v >.37) && (v < .63)) /* the longitudinal ridges */
- magnitude = -sin(UFREQ*u) - 1;
- else if ((v >= R3MIN) && (v <= R3MAX)) /* third circular ridge */
- magnitude = 3*(1 - cos(VFREQ*(v-R3MIN)));
- else if ((v >= R4MIN) && (v <= R4MAX)) /* fourth circular ridge */
- magnitude = 3*(1 - cos(VFREQ*(v-R4MIN)));
-
- /* Now apply the displacement in the direction of the normal. */
- P += Km * magnitude * normalize(N);
-
- /* Recalculate the normal. */
- N = calculatenormal(P);
- }
-
-